﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Insifo.WE;
using System.Text.RegularExpressions;
using System.Collections.Specialized;

public partial class seg_segUsuarioMenuListar : ObjectPage
{
    #region PROPIEDADES

    public string FilaSeleccionadaID
    {
        set { ViewState["FilaSeleccionadaID"] = value; }
        get
        {
            if (ViewState["FilaSeleccionadaID"] == null)
                ViewState["FilaSeleccionadaID"] = string.Empty;
            return ViewState["FilaSeleccionadaID"].ToString();
        }
    }

    #endregion

    #region EVENTOS

    protected void Page_Load(object sender, EventArgs e)
    {
        //Eventos del Master
        Master.MenuAccionEvento += new MasterPageMenuEditarClickHandler(Master_MenuButton);
        if (!IsPostBack)
        {
            Cargar();
        }
    }

    protected void Master_MenuButton(object sender, EventArgs e)
    {
        string strAccion = ((CommandEventArgs)e).CommandName;
        switch (strAccion)
        {
            case "Aceptar":
                Guardar("G");
                break;
            case "Aplicar":
                Guardar("A");
                break;
        }
    }

    protected void lvUsuario_ItemCommand(object sender, ListViewCommandEventArgs e)
    {
        SeleccionarFila(e.CommandName);
        //Se guarda el id de la Aplicacion
        hfCodigoUsuario.Value = e.CommandArgument.ToString();
        //Muestra los usuarios de la aplicacion seleccionada
        MostrarMenuPorUsuario();
        Util.ejecutaScriptAJAX(this.Page, "CargarArbol();");
    }

    protected void lvUsuario_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        if (e.Item.ItemType == ListViewItemType.DataItem)
        {
            HtmlTableRow htr = (HtmlTableRow)e.Item.FindControl("TrFila");
            ImageButton img = (ImageButton)e.Item.FindControl("ibtSeleccionar");
            img.CommandName = htr.UniqueID;

            if (DataBinder.Eval(e.Item.DataItem, "Estado").ToString().Equals(Constantes.ESTADO_INACTIVO))
            {
                Label lblEstado = (Label)e.Item.FindControl("lblEstado");
                if (lblEstado != null)
                {
                    lblEstado.ForeColor = System.Drawing.ColorTranslator.FromHtml("#ff6230");
                }
            }
        }
    }

    protected void ibtBuscar_Click(object sender, ImageClickEventArgs e)
    {
        MostrarListadoUsuarios();
    }

    protected void ibtBuscarMenu_Click(object sender, ImageClickEventArgs e)
    {
        ViewState["Aplicacion"] = ddlAplicacion.SelectedValue;
        MostrarMenuPorUsuario();
    }

    protected void ucpagLista_CambioPagina(object sender, EventArgs e)
    {
        ListarUsuarioListView();
    }

    protected void btnAceptar_Click(object sender, EventArgs e)
    {
        Guardar("G");
    }

    #endregion

    #region METODOS

    /// <summary>
    /// Se establece los filtros de la busqueda del usuario
    /// </summary>
    protected void EstablecerFiltrosUsuario()
    {
        ViewState["CodigoUsuario"] = txtCodigoUsuario.Text.Trim();
        ViewState["Nombre"] = txtDescripcionUsuario.Text.Trim();
        ViewState["Tipo"] = ddlTipoUsuario.SelectedValue;
        ViewState["Estado"] = ddlEstado.SelectedValue;
    }


    /// <summary>
    /// Se oculta el listado de usuario por aplicacion
    /// </summary>
    /// <param name="blnMostrar">Ocultar Formulario de Usuario</param>
    protected void MostrarPanelEnBlanco(bool blnMostrar)
    {
        pnlFormulario.Style["display"] = blnMostrar ? "none" : "block";
        pnlSeleccioneUsuario.Style["display"] = blnMostrar ? "block" : "none";
        //divTreeView.Visible = !blnMostrar;??
    }

    /// <summary>
    /// Muestra los usuarios de la aplicacion seleccionada
    /// </summary>
    protected void MostrarMenuPorUsuario()
    {
        //Se muestra el formulario de Usuario
        MostrarPanelEnBlanco(false);
    }

    /// <summary>
    /// Seleccionar Suite
    /// </summary>
    protected void BusquedaUsuario()
    {
        //Establece los valores de busqueda
        EstablecerFiltrosUsuario();
        //Se lista las aplicaciones
        ListarUsuarioListView();
        //Se oculta el formulario de Usuario
        MostrarPanelEnBlanco(true);
    }

    /// <summary>
    /// Listado de Usuarios
    /// </summary>
    protected void ListarUsuarioListView()
    {
        int intTotalFilas = 0, intFilasXPagina = 0;
        string strCodigoUsuario = ViewState["CodigoUsuario"].ToString();
        string strNombre = ViewState["Nombre"].ToString();
        string strTipo = ViewState["Tipo"].ToString();
        string strEstado = ViewState["Estado"].ToString();

        DataTable dt = ListarUsuario(strCodigoUsuario, strNombre, strTipo, strEstado, ucpagLista.NumeroPagina);
        lvUsuario.DataSource = dt;
        lvUsuario.DataBind();
        if (dt.Rows.Count > 0)
        {
            intFilasXPagina = Convert.ToInt32(dt.Rows[0]["FilasXPagina"]);
            intTotalFilas = Convert.ToInt32(dt.Rows[0]["TotalFilas"]);
        }
        ucpagLista.TotalRegistros = intTotalFilas;
        ucpagLista.RegistrosPorPagina = intFilasXPagina;
        ucpagLista.EnlazarPaginador();
    }

    protected void Cargar()
    {
        this.Master.MenuSalir.Visible = false;
        this.Master.MenuAplicar.Visible = false;
        Master.SubTitulo.Text = Resources.resDiccionario.Editar;
        string strAccion = Request.QueryString["a"];   //a: N-Nuevo, e-Editar, v-Ver
        string strId = Request.QueryString["i"];  //Id
        ddlAplicacion.Attributes.Add("onchange", "javascript:return CargarArbol();");
        Master.MenuAceptar.Attributes.Add("onclick", "javascript:return fnAceptar();");
        ibtnBuscarMenu.Attributes.Add("onclick", "javascript:return CargarArbol();");

        //Carga las Suites
        Util.loadComboAndItem(ddlAplicacion, ListarAplicaciones(), "Descripcion", "IdAplicacion", "Suit", string.Format("--{0}--", Resources.resDiccionario.Todos), "0");
        //Carga los Tipo de Usuario
        Util.loadComboAndItem(ddlTipoUsuario, ListarParametroDetalle(1, 1, Constantes.PARAMETRO_TIPOUSUARIO), "Descripcion", "ParametroDetalle", string.Format("--{0}--", Resources.resDiccionario.Todos), "");
        Util.SelectCombo(ddlTipoUsuario, Constantes.TIPOUSUARIO_USUARIO);
        //Carga los Estado del Usuario
        Util.loadCombo(ddlEstado, ListarParametroDetalle(1, 1, Constantes.PARAMETRO_ESTADOREGISTRO), "Descripcion", "ParametroDetalle");
        MostrarListadoUsuarios();
    }

    protected void obtenerNodosSeleccionados(ref List<WCUsuarioMenu.BEUsuarioMenu> plstNodos)
    {
        string strUsuario = UsuarioSistema.CodigoUsuario;
        string[] strCadena = hfCadena.Value.Split('*');
        foreach (string strKey in strCadena)
        {
            if (!string.IsNullOrEmpty(strKey))
            {
                string[] strMenu = strKey.Split('|');

                if (strMenu[1] != "B")
                {
                    plstNodos.Add(new WCUsuarioMenu.BEUsuarioMenu
                    {
                        IdMenu = int.Parse(strMenu[0]),
                        CodigoUsuario = hfCodigoUsuario.Value,
                        UsuarioCreacion = strUsuario,
                        Estado = strMenu[2] == "1" ? Constantes.ESTADO_ACTIVO : Constantes.ESTADO_INACTIVO,
                        RefAccion = strMenu[2] == "1" ? WCUsuarioMenu.DbTipoAccion.Insertar : WCUsuarioMenu.DbTipoAccion.Actualizar,
                    });
                }
            }
        }
    }

    protected void obtenerAccionesSeleccionados(ref List<WCUsuarioMenu.BEAccion> plstAcciones)
    {
        string strUsuario = UsuarioSistema.CodigoUsuario;
        string[] strCadena = hfCadena.Value.Split('*');
        foreach (string strKey in strCadena)
        {
            if (!string.IsNullOrEmpty(strKey))
            {
                string[] strMenu = strKey.Split('|');

                if (strMenu[1] == "B")
                {
                    var strCodigo = strMenu[0].Split('-');
                    plstAcciones.Add(new WCUsuarioMenu.BEAccion
                    {
                        IdMenu = int.Parse(strCodigo[0]),
                        IdAccion = int.Parse(strCodigo[1]),
                        UsuarioCreacion = hfCodigoUsuario.Value,
                        CodigoAccion = strMenu[2].ToString()
                    });
                }
            }
        }
    }

    /// <summary>
    /// Marca la seleccion de la fila del usuario
    /// </summary>
    /// <param name="pstrFilaId"></param>
    protected void SeleccionarFila(string pstrFilaId)
    {

        if (!string.IsNullOrEmpty(FilaSeleccionadaID))
        {
            Control ctrlPrevious = this.Form.FindControl(FilaSeleccionadaID);
            if (ctrlPrevious != null)
                ((HtmlControl)ctrlPrevious).Attributes["class"] = string.Empty;
        }
        ((HtmlControl)this.Form.FindControl(pstrFilaId)).Attributes["class"] = "lista-seleccion";
        FilaSeleccionadaID = pstrFilaId;
    }

    protected bool Validar(out WCUsuarioMenu.BEUsuario pbe)
    {
        //Menus
        List<WCUsuarioMenu.BEUsuarioMenu> beMenus = new List<WCUsuarioMenu.BEUsuarioMenu>();
        //Acciones
        List<WCUsuarioMenu.BEAccion> beAcciones = new List<WCUsuarioMenu.BEAccion>();

        obtenerNodosSeleccionados(ref beMenus);
        //Inicializa
        WCUsuarioMenu.BEUsuario be = new WCUsuarioMenu.BEUsuario
        {
            CodigoUsuario = hfCodigoUsuario.Value,
            Menus = beMenus.ToArray(),
            Acciones = beAcciones.ToArray()
        };
        pbe = be;
        return true;
    }

    protected void Guardar(string pstrEvento) //G:Grabar, A:Aplicar
    {
        string strAccion = string.Empty;
        string strUsuario = string.Empty;
        strUsuario = UsuarioSistema.CodigoUsuario;
        WCUsuarioMenu.BEUsuario be;
        if (!Validar(out be)) //Valida e Inicializa
        {
            return;
        }

        be = InsertarUsuarioMenu(be);

        //Agrega la acciones de cada aplicacion
        List<WCUsuarioMenu.BEAccion> beAcciones = new List<WCUsuarioMenu.BEAccion>();
        obtenerAccionesSeleccionados(ref beAcciones);
        be.Acciones = beAcciones.ToArray();
        be = InsertarUsuarioAcciones(be);

        if (be.Error != 0)
        {
            Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgErrorRegistrarMenu));
        }
        if (pstrEvento == "G") //Si es GRABAR redirecciona a la Lista
        {
            if (be.Error == 0)
            {
                MostrarMenuPorUsuario();
            }
        }
        else
        {
            MostrarListadoUsuarios();
            MostrarMenuPorUsuario();
        }
        Util.ejecutaScriptAJAX(this.Page, "fnActualizaNodos();");

    }

    protected void MostrarListadoUsuarios()
    {
        //Se establece los filtros de busqueda
        EstablecerFiltrosUsuario();
        //Se lista los usuarios de la aplicacion
        ListarUsuarioListView();
        //Ocultar el Listado de Menu
        MostrarPanelEnBlanco(true);
    }

    #endregion

    #region LLAMDAS A WEBSERVICES

    /// <summary>
    /// Método los usuarios de la aplicacion
    /// </summary>
    /// <returns>Devuelve un DataSet</returns>
    protected WCUsuarioMenu.BEUsuario InsertarUsuarioMenu(WCUsuarioMenu.BEUsuario pbe)
    {
        WCUsuarioMenu.BEUsuario be = new WCUsuarioMenu.BEUsuario();
        using (var client = new ServiceClient<WCUsuarioMenu.IWCUsuarioMenu>("BasicHttpBinding_IWCUsuarioMenu"))
        {
            var response = client.ServiceOperation<WCUsuarioMenu.BEUsuario>(
               c => c.Insertar(pbe)
               );
            ;
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método que inserta las cciones de los usuarios de la aplicacion
    /// </summary>
    /// <returns>Devuelve un BEUsuario</returns>
    protected WCUsuarioMenu.BEUsuario InsertarUsuarioAcciones(WCUsuarioMenu.BEUsuario pbe)
    {
        WCUsuarioMenu.BEUsuario be = new WCUsuarioMenu.BEUsuario();
        using (var client = new ServiceClient<WCUsuarioMenu.IWCUsuarioMenu>("BasicHttpBinding_IWCUsuarioMenu"))
        {
            var response = client.ServiceOperation<WCUsuarioMenu.BEUsuario>(
               c => c.InsertarAcciones(pbe)
               );
            ;
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método Obtiene la Aplicacion
    /// </summary>
    /// <returns>Devuelve un Objeto</returns>
    protected WCAplicacion.BEAplicacion ObtenerAplicacion(int pintIdAplicacion)
    {
        WCAplicacion.BEAplicacion be = new WCAplicacion.BEAplicacion();
        be.IdAplicacion = pintIdAplicacion;
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCAplicacion.IWCAplicacion>("BasicHttpBinding_IWCAplicacion"))
        {
            var response = client.ServiceOperation<WCAplicacion.BEAplicacion>(
               c => c.Obtener(be)
               );
            ;
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Lista los Suit de la Aplicacion
    /// </summary>
    /// <returns></returns>
    protected DataTable ListarAplicaciones()
    {
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCAplicacion.IWCAplicacion>("BasicHttpBinding_IWCAplicacion"))
        {
            var response = client.ServiceOperation<DataTable>(
                c => c.Listar().Tables[0]
                    );
            ;
            dt = response;
        }
        return dt;
    }

    /// <summary>
    /// Lista los Suit de la Aplicacion
    /// </summary>
    /// <returns></returns>
    protected DataTable ListarUsuario(string pstrCodigoUsuario, string pstrNombre, string pstrTipo, string pstrEstado, int pintPagina)
    {
        DataTable dt = new DataTable();
        WCUsuario.BEUsuario beUsuario = new WCUsuario.BEUsuario();
        beUsuario.CodigoUsuario = pstrCodigoUsuario;
        beUsuario.Nombre = pstrNombre;
        beUsuario.Tipo = pstrTipo;
        beUsuario.Estado = pstrEstado;
        beUsuario.Pagina = pintPagina;
        using (var client = new ServiceClient<WCUsuario.IWCUsuario>("BasicHttpBinding_IWCUsuario"))
        {
            var response = client.ServiceOperation<DataTable>(
                c => c.Listar(beUsuario).Tables[0]
                    );
            ;
            dt = response;
        }
        return dt;
    }

    /// <summary>
    /// Método Lista Companias
    /// </summary>
    /// <returns>Devuelve un dataTable</returns>
    protected DataTable ListarParametroDetalle(int pintidCompania, int pintIdAplicacion, string pstrParametro)
    {
        WCParametroDetalle.BEParametroDetalle be = new WCParametroDetalle.BEParametroDetalle();
        be.IdCompania = pintidCompania;
        be.IdAplicacion = pintIdAplicacion;
        be.Parametro = pstrParametro;
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCParametroDetalle.IWCParametroDetalle>("BasicHttpBinding_IWCParametroDetalle"))
        {
            var response = client.ServiceOperation<DataTable>(c => c.Listar(be).Tables[0]);
            dt = response;
        }
        return dt;
    }

    /// <summary>
    /// Método Lista Menus por Nivel
    /// </summary>
    /// <returns>Devuelve un dataTable</returns>
    protected DataTable ListarMenuPorNivel(int pintIdAplicacion, int pintIdMenu, string pstrCodigoUsuario)
    {
        WCUsuarioMenu.BEUsuarioMenu be = new WCUsuarioMenu.BEUsuarioMenu();
        be.IdAplicacion = pintIdAplicacion;
        be.IdMenu = pintIdMenu;
        be.CodigoUsuario = pstrCodigoUsuario;
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCUsuarioMenu.IWCUsuarioMenu>("BasicHttpBinding_IWCUsuarioMenu"))
        {
            var response = client.ServiceOperation<DataTable>(
               c => c.ListarPorNivel(be).Tables[0]
               );
            ;
            dt = response;
        }
        return dt;
    }

    #endregion

}